package sanrenxing.statu.servlet;

import com.google.gson.Gson;
import sanrenxing.statu.dao.StatuDao;
import sanrenxing.statu.dao.impl.StatuDaoImpl;
import sanrenxing.statu.domain.Statu;
import sanrenxing.statu.domain.StatuTo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 功能:考生状态
 * 编写者:黄雄珠
 * 创建时间：2020/9/27 18:15
 * 版本:1.0
 */
@WebServlet("/StatuServlet")
public class StatuServlet extends HttpServlet {
    //定义数据层对象
    private StatuDao statuDao=new StatuDaoImpl();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");

        //获得请求路径中的操作方式参数
        String method=req.getParameter("method");
        //判断操作方式，执行方法代码
        if("findAll".equals(method)){
            //调用查询所有数据的方法findAll
            findAll(req,resp);
        } else if("batchDel".equals(method)){
            //调用删除方法batchDel
            batchDel(req,resp);
        }
    }

    /**
     * 批量删除数据
     * @param req 请求对象
     * @param resp 响应对象
     * @throws ServletException Servlet异常
     * @throws IOException IO异常
     */
    private void batchDel(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //定义输出流对象
        PrintWriter out=resp.getWriter();

        //得到来自请求中的考生状态编号字符串conditionIdStr
        String conditionIdStr=req.getParameter("conditionIdStr");
        //对员工编号字符串conditionIdStr按","进行分割split
        String[] conditionIdStrs=conditionIdStr.split(",");
        //由于是批量删除，使用异常和循环来进行判断删除是否成功
        try{
            //循环删除statuStr
            for(String statuStr:conditionIdStrs){
                //把字符串statuStr转换为整型的员工编号conditionId
                int conditionId=Integer.parseInt(statuStr);
                //调用数据层delete代码进行删除
                statuDao.delete(conditionId);
            }
            //向客户端发送操作结果
            out.print("ok");
        }catch(Exception e){
            out.print("no");
        }
        //关闭输出流对象
        out.close();
    }


    /**
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    private void findAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建输出流对象
        PrintWriter out = resp.getWriter();
        //获取当前页数
        String pageStr=req.getParameter("page");
        //如果获取的页数为null，则默认为1，如果不为null 则把获取的页数赋值给page
        int page=1;
        if (pageStr!=null&&pageStr.trim().length()!=0) {
           page= Integer.parseInt((pageStr));
        }
        //获取每页行数
        //如果获取的行数limit为空 则默认为5 如果不为null，则把获取的行数赋值给rows
        String rowsStr=req.getParameter("limit");
        int rows=5;
        if (rowsStr!=null&&rowsStr.trim().length()!=0) {
            rows= Integer.parseInt((rowsStr));
        }
        //定义用于构造多条件查询的对象
        Statu statu = new Statu();
        //获取来自请求中的学员名字stuName
        String stuName = req.getParameter("stuName");
        //判断成绩编号，是否加入到成绩对象中
        if (stuName != null && stuName.trim().length() != 0) {
            //通过数据层方法findStuId 利用学员名字查询到学员编号
            String stuId=statuDao.findStuId(stuName);
            //修改statu对象中的学员编号stuId
            statu.setStuId(stuId);
        }
        //获取来自请求的班级名称className
        String className = req.getParameter("className");
        //判断并加入
        if (className != null && className.trim().length() != 0) {
            //通过数据层findClassId方法利用班级名称查询班级编号
            int classId=statuDao.findClassId(className);
            //修改statu对象中的班级编号
            statu.setClassId(classId);
        }
        //获取来自请求的考生状态conditions
        String conditions = req.getParameter("conditions");
        //判断并加入
        if (conditions != null && conditions.trim().length() != 0) {
            //修改statu对象中的考生状态
            statu.setConditions(conditions);
        }
        //调用数据方法，根据员工对象构造查询条件字符串
        String condition = statuDao.getCondition(statu);
        //执行多条件分页查询
        List<StatuTo> statuToList = statuDao.findByPage(rows, page, condition);
        //多条件查询表中总记录数
        int totalRows = statuDao.count(condition);

        //定义映射集合对象
        Map<String, Object> mapData = new HashMap<String, Object>();
        //在映射集合中添加key为code，值为0的状态码
        mapData.put("code", 0);
        //在映射集合中添加key为msg,值为响应信息字符串
        mapData.put("msg", "");
        //在映射集合中添加key为count,值总行数的数据对
        mapData.put("count", totalRows);
        //在映射集合中添加key为data,值为员集合对象
        mapData.put("data", statuToList);
        //建立Gson对象
        Gson gson = new Gson();
        //使用Gson对象把映射集合转换为json格式数据
        String json1 = gson.toJson(mapData);
        //将json数据输出到客户端
        out.write(json1);
        //关闭输出流对象
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
